package org.Shiikong_Memory.SakuraBlockFrame.CommandFramework;

import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 定义命令参数的类型枚举类，用于指定不同命令参数的类型，并提供获取参数补全项的方法。
 * 不同的枚举值代表不同的参数类型，每种类型都有对应的 Java 类和补全逻辑。
 *
 *
 * @author Shiikong_Memory
 * @version 1.0
 */
@Getter
public enum ArgType {
    /**
     * 自动类型，根据参数的实际类型进行处理。
     */
    Auto(Object.class){
        @Override
        public List<String> getCompletions() {
            return List.of();
        }
    },
    /**
     * 字符串类型，使用 String 类
     */
    STRING(String.class){
        public List<String> getCompletions() {
            return List.of();
        }
    },   // 字符串
    /**
     * 整数类型，使用 Integer 类
     */
    INTEGER(Integer.class){
        public List<String> getCompletions() {
            return List.of("[整数]");
        }
    }, // 整数
    /**
     * 浮点类型，使用 Integer 类
     */
    DOUBLE(Double.class){
        public List<String> getCompletions() {
            return List.of("[数字]");
        }
    }, // 浮点
    /**
     * 布尔类型，使用 Boolean 类
     */
    BOOLEAN(Boolean.class){
        public List<String> getCompletions() {
            return List.of("false", "true");
        }
    }, // 布尔型
    /**
     * 玩家类型，使用 Player 类
     */
    PLAYER(Player.class){
        public List<String> getCompletions() {
            return Bukkit.getOnlinePlayers().stream()
                    .map(Player::getName)
                    .collect(Collectors.toList());
        }
    },   // 玩家
    /**
     * 世界类型，使用 World 类
     */
    WORLD(World.class){
        public List<String> getCompletions() {
            return Bukkit.getWorlds().stream()
                    .map(World::getName)
                    .collect(Collectors.toList());
        }
    };     // 世界

    private final Class<?> type;

    ArgType(Class<?> type) {
        this.type = type;
    }

    public abstract List<String> getCompletions();
}
